iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
佛心分享-IT 人自學之術

從0開始的ABAP之旅 系列 第 7

Day07 ALV 詳解 (中) 學ABAP順便學SQL 一舉兩得

  • 分享至 

  • xImage
  •  

大家好
今天要來分享再ALV Report中如何取得我們要的資料,並經過處理最後變成我們要的格式

前置作業

宣告內表

要把資料撈出來前一定要先有裝資料的容器,
在ABAP中就是我們的內表

Types :begin of itab ,    "宣告內表的結構
matnr type matnr ,
werks  type werks ,
days type i ,   "用days作為庫齡,因為天數是整數所以用i資料類型

end of itab .

DAYA t_itab type table of itab . "根據itab結構來宣告t_itab內表  

除了內表外還要需告我們資料來源會用到的表

DATA t_mbew type table of mbew .  "因為要從mbew取得物料的庫存數所以宣告一個結構為mbew的表 

執行程式 Start of selection

Start of selection  .  "這個事件在系統處理完畫面輸入後,正式開始執行主要邏輯時觸發。可以把它理解為報表邏輯的起點。
select  * from mbew into t_mbew where bwkey = p_werks and matnr in p_matnr and lbkum ne 0.

SELECLT

select * from mbew : 代表從mbew表中抓取符合條件的所有欄位
select single * : 加了single 代表我們只要符合條件的一行數據
select matnr lbkum :代表只抓取matnr lbkum這兩個欄位

into

將符合條件的資料放入表中

where

我們要搜尋的條件,用上面的程式碼為例,
bwkey 等於 我們輸入的廠別 p_werks & 料號在我們輸入的料號清單中 & lbkum ne 0 庫存不為0

現在我們得到的資料有 -> 根據我們想查詢的廠別當中,庫存不為0的料號清單,還有料號的庫存數量

下一步就來處理資料還有計算我們要的庫齡吧!

LOOP AT

既然要針對每一個料號計算就要用到LOOP語法,

LOOP AT T_MBEW . 


data:
    lt_matnr type bapi2017_gm_material_ra occurs 0 with header line,
    lt_werks type bapi2017_gm_plant_ra occurs 0 with header line,
    lt_bwart type bapi2017_gm_move_type_ra occurs 0 with header line,
    lt_mseg type bapi2017_gm_item_show occurs 0 with header line,
    lt_mkpf type bapi2017_gm_head_02 occurs 0 with header line,
    lt_rtn type bapiret2 occurs 0 with header line,
    lt_pstng type  bapi2017_gm_pstng_date_ra occurs 0 with header line.
clear:lt_mkpf,lt_mkpf[],lt_mseg,lt_mseg[],lt_rtn,lt_rtn[],lt_matnr,lt_matnr[].
    "宣告等等要用的變數

    lt_matnr-sign = 'I'.
    lt_matnr-option = 'EQ'.
    lt_matnr-low = t_mbew-matnr.
    append lt_matnr.

call function 'BAPI_GOODSMVT_GETITEMS'  "call mb51 找異動
      tables
        material_ra     = lt_matnr
        plant_ra        = P_werks
        
        move_type_ra    = lt_bwart
        goodsmvt_header = lt_mkpf
        goodsmvt_items  = lt_mseg
        return          = lt_rtn.
        
        sort lt_mkpf by pstng_date descending.   "將異動紀錄根據時間排序 
      
      T_ITAB-DAYS = sy-datum - lt_mkpf-pstng_date. " sy-datum 是當下日期  - 最新一筆異動日
      
      t_itab-matnr = t_mbew-matnr . "將料號填入內表
      t_itab-werks = p_werks .      "將工廠別填入內表
      
      append t_itab .  "將在工作區的資料插入內表中 
      
      endloop.   " 最後loop一定要搭配endloop 表示遍歷結束

        
       
        
        
        

LOOP AT 是 ABAP 中用來遍歷內表(Internal Table)的語句。它允許逐行讀取內表的數據並對每一行進行操作。

Call function

CALL FUNCTION 是 ABAP 中用來調用 Function Module(函數模塊)的語法。
簡單來說就是使用SAP已經幫你寫好的程式啦,
學會使用這些Function大大提升我們開發的效率,
BAPI_GOODSMVT_GETITEMS這個function可以幫助我們取得料號的異動紀錄

不論是開發報表、FUNCTION 之前我的習慣是先GOOGLE SAP內是否有提供標準功能,
一方面是節省時間,一方面是如果客製程式太多對於後續維護上來說也會比較麻煩,
以上就是今天分享的內容!/images/emoticon/emoticon29.gif


上一篇
Day06 ALV詳解 (上) Input 介面
下一篇
Day 08 ALV詳解(下) 報表顯示設定
系列文
從0開始的ABAP之旅 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言